{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 20,
   "id": "2d1a8374",
   "metadata": {},
   "outputs": [],
   "source": [
    "import os\n",
    "import h5py\n",
    "import numpy as np\n",
    "import tensorflow as tf\n",
    "import matplotlib.pyplot as plt\n",
    "import seaborn as sbn"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "9c5f2f89",
   "metadata": {},
   "outputs": [],
   "source": [
    "def load_mat_file(file_path, matrix_name):\n",
    "    with h5py.File(file_path, 'r') as file:\n",
    "        matrix = file[matrix_name][()]\n",
    "    return matrix"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "9c14dbaf",
   "metadata": {},
   "outputs": [],
   "source": [
    "def load_data(base_path, folders, matrix_name):\n",
    "    data_list = []\n",
    "    labels_list = []\n",
    "    for label, folder in enumerate(folders):\n",
    "        folder_path = os.path.join(base_path, folder)\n",
    "        for file_name in os.listdir(folder_path):\n",
    "            if file_name.endswith('.mat'):\n",
    "                file_path = os.path.join(folder_path, file_name)\n",
    "                matrix = load_mat_file(file_path, matrix_name)\n",
    "                data_list.append(matrix)\n",
    "                labels_list.append(label)\n",
    "    return np.array(data_list), np.array(labels_list)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "4f06b2fb",
   "metadata": {},
   "outputs": [],
   "source": [
    "def preprocess_data(data):\n",
    "    # Normalize data\n",
    "    data = data.astype(np.float32)\n",
    "    data /= np.max(data)\n",
    "    return data"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "64e78f04",
   "metadata": {},
   "outputs": [],
   "source": [
    "def create_dataset(data, labels, batch_size=32):\n",
    "    dataset = tf.data.Dataset.from_tensor_slices((data, labels))\n",
    "    dataset = dataset.shuffle(buffer_size=len(data))\n",
    "    dataset = dataset.batch(batch_size)\n",
    "    dataset = dataset.prefetch(tf.data.AUTOTUNE)\n",
    "    return dataset"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "fbff914d",
   "metadata": {},
   "outputs": [],
   "source": [
    "# # Uncomment to build Neural Network 1\n",
    "\n",
    "#     def build_model(input_shape, num_classes):\n",
    "#         model = tf.keras.Sequential([\n",
    "#             tf.keras.layers.Flatten(input_shape=input_shape),\n",
    "#             tf.keras.layers.Dropout(0.03),\n",
    "#             tf.keras.layers.Dense(128, activation='relu'),\n",
    "#             tf.keras.layers.Dropout(0.03),\n",
    "#             tf.keras.layers.Dense(128, activation='relu'),\n",
    "#             tf.keras.layers.Dropout(0.03),\n",
    "#             tf.keras.layers.Dense(128, activation='relu'),\n",
    "#             tf.keras.layers.Dropout(0.03),\n",
    "#             tf.keras.layers.Dense(128, activation='relu'),\n",
    "#             tf.keras.layers.Dropout(0.03),\n",
    "#             tf.keras.layers.Dense(128, activation='relu'),\n",
    "#             tf.keras.layers.Dropout(0.03),\n",
    "#             tf.keras.layers.Dense(num_classes, activation='softmax'),\n",
    "#             tf.keras.layers.Dropout(0.03),\n",
    "#         ])\n",
    "#         model.compile(optimizer='adam',\n",
    "#                       loss='sparse_categorical_crossentropy',\n",
    "#                       metrics=['accuracy'])\n",
    "#         return model"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "5d8507fd",
   "metadata": {},
   "outputs": [],
   "source": [
    "# Uncomment to build Neural Network 2\n",
    "\n",
    "    def build_model(input_shape, num_classes):\n",
    "        model = tf.keras.Sequential([\n",
    "            tf.keras.layers.Flatten(input_shape=input_shape),\n",
    "            tf.keras.layers.Dropout(0.03),\n",
    "            tf.keras.layers.Dense(32, activation='relu'),\n",
    "            tf.keras.layers.Dropout(0.03),\n",
    "            tf.keras.layers.Dense(32, activation='relu'),\n",
    "            tf.keras.layers.Dropout(0.03),\n",
    "            tf.keras.layers.Dense(32, activation='relu'),\n",
    "            tf.keras.layers.Dropout(0.03),\n",
    "            tf.keras.layers.Dense(32, activation='relu'),\n",
    "            tf.keras.layers.Dropout(0.03),\n",
    "            tf.keras.layers.Dense(32, activation='relu'),\n",
    "            tf.keras.layers.Dropout(0.03),\n",
    "            tf.keras.layers.Dense(32, activation='relu'),\n",
    "            tf.keras.layers.Dropout(0.03),\n",
    "            tf.keras.layers.Dense(32, activation='relu'),\n",
    "            tf.keras.layers.Dropout(0.03),\n",
    "            tf.keras.layers.Dense(32, activation='relu'),\n",
    "            tf.keras.layers.Dropout(0.03),\n",
    "            tf.keras.layers.Dense(32, activation='relu'),\n",
    "            tf.keras.layers.Dropout(0.03),\n",
    "            tf.keras.layers.Dense(32, activation='relu'),\n",
    "            tf.keras.layers.Dropout(0.03),\n",
    "            tf.keras.layers.Dense(32, activation='relu'),\n",
    "            tf.keras.layers.Dropout(0.03),\n",
    "            tf.keras.layers.Dense(32, activation='relu'),\n",
    "            tf.keras.layers.Dropout(0.03),\n",
    "            tf.keras.layers.Dense(32, activation='relu'),\n",
    "            tf.keras.layers.Dropout(0.03),\n",
    "            tf.keras.layers.Dense(32, activation='relu'),\n",
    "            tf.keras.layers.Dropout(0.03),\n",
    "            tf.keras.layers.Dense(32, activation='relu'),\n",
    "            tf.keras.layers.Dropout(0.03),\n",
    "            tf.keras.layers.Dense(32, activation='relu'),\n",
    "            tf.keras.layers.Dropout(0.03),\n",
    "            tf.keras.layers.Dense(num_classes, activation='softmax'),\n",
    "            tf.keras.layers.Dropout(0.03),\n",
    "        ])\n",
    "        model.compile(optimizer='adam',\n",
    "                      loss='sparse_categorical_crossentropy',\n",
    "                      metrics=['accuracy'])\n",
    "        return model"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "148f9450",
   "metadata": {},
   "outputs": [],
   "source": [
    "# Update the path for test data\n",
    "base_path = 'psths_Training_SNRs_11_30/'\n",
    "\n",
    "# Update folder names\n",
    "folders = ['gas', 'lot', 'live', 'south', 'size',\n",
    "           'gap', 'reach', 'jug', 'hurl', 'chief',\n",
    "           'pike', 'cheek', 'kill', 'goose', 'bean',\n",
    "           'late', 'hall', 'met', 'pole', 'yearn',\n",
    "           'haze', 'doll', 'limb', 'dip', 'shirt']\n",
    "\n",
    "# Matrix name in .mat files\n",
    "matrix_name = 'psth_SUM'\n",
    "\n",
    "# Load and preprocess data\n",
    "data, labels = load_data(base_path, folders, matrix_name)\n",
    "data = preprocess_data(data)\n",
    "\n",
    "# Create dataset\n",
    "batch_size = 32\n",
    "dataset = create_dataset(data, labels, batch_size)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "e0e94e73",
   "metadata": {},
   "outputs": [],
   "source": [
    "# Build the model\n",
    "input_shape = data.shape[1:]\n",
    "num_classes = len(folders)\n",
    "model = build_model(input_shape, num_classes)\n",
    "\n",
    "# Train the model\n",
    "history = model.fit(dataset,\n",
    "        shuffle=True,\n",
    "        epochs=500)  # Adjust epochs as needed\n",
    "\n",
    "# Evaluate the model\n",
    "loss, accuracy = model.evaluate(dataset)\n",
    "print(f\"Loss: {loss}, Accuracy: {accuracy}\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "id": "3cc13d6c",
   "metadata": {},
   "outputs": [],
   "source": [
    "# Save the model\n",
    "model.save('NN2_L16_N32_E500_25words_SNRs_11_30_dBs.keras')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 39,
   "id": "0bc033d7",
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "No artists with labels found to put in legend.  Note that artists whose label start with an underscore are ignored when legend() is called with no argument.\n",
      "No artists with labels found to put in legend.  Note that artists whose label start with an underscore are ignored when legend() is called with no argument.\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "<Figure size 432x288 with 0 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "image/png": "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dy6vvPIKgwYNYvHixYwYMYKzzjqLBQsWsPnmm3PHHXcwYULe1KyR5Z9XXsnHXqKgc3vHnZJx/0auw1YXXRSojoceeohXX32V1157jYULF7L33nszZswY7r33Xr70pS/R2dlJX18fK1eu5NVXX+Xdd9/l73//OwBLly4tqN2lwk14qz3H/QZQslFbqNg+xpgngSdLdfF6wvV61rP7d7z2Kk0bbVTWa44ePbrgMA7JEM1RE/98pAt/vv1Buemmm3j44YcBePvtt+nu7mbMmDEDbnwjR1oPuhkzZvDLX66zco4YMSJv3SeeeCLNzTbG1ocffsipp57KG2+8gYiwZs2agXrPPPNMBg0atN71xo0bx/Tp05kwYQKzZs3i7rvvLqqfjczzzz/PSSedRHNzM1tuuSVf/OIXefHFF9l777057bTTWLNmDV/5ylfYY4892GGHHfjHP/7BOeecw9FHH83hhx9e7eYD/AE7+H6mFJWFEn8RGYQN5bxB0gBjTHUC2UQU88knUEbxj8fjRU9iFfrmUE7yjdCzxS1qa2vjmWeeKeiazzzzDDNmzGDWrFm0trZy4IEHsvvuuw+YZFIxxmScZ0ndl+7+N3ToOueMSy65hIMOOoiHH36YefPmceCBB+asd8KECRxzzDEMGTKEE088ceDhUIvkG6Hncppou6f4h142E+mYMWN47rnn+N3vfse4ceM477zzOOWUU3jttdd48sknufXWW7n//vuZNm1a0W0okluB//a9ex7DTviu1yk3EXxRUSCbv4i0iMjtwDLgDeBvGTYlBfPJJ2WbwEravYsN2Rw1f/8gdHV10draut6+YiOOfvjhh4wYMYLW1lYSicSAaenZZ59l7ty5AANmn8MPP5xbbrll4Nyk2WfLLbfE8zz6+/sH3iCyXWubbbYB4M477xzYf/jhhzN16tSBSeHk9bbeemu23nprfvzjHw/MIyiFMWbMGO677z76+vpYsGABzz33HF/4whfo7e1liy224IwzzuD000/n5ZdfZuHChfT393PCCSdwxRVX8PLLkYhU/wSwLXAuMAN4nXX6+3dC6nDQYcSlwJeB07E2p7OAFcDJwKeBc8JctN7IlNjljf32z1q+2Amszs7OvKEcRCTnZLCIRNLfPx9JM1Upg9EdccQRTJ06ld12242Ojg722WcfNt98c7q7uzn++OPp7+9niy22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\n",
      "text/plain": [
       "<Figure size 360x360 with 2 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.figure()\n",
    "fig, ax1 =plt.subplots(figsize=(5, 5))\n",
    "\n",
    "ax1.plot(history.epoch, 100*np.array(history.history['accuracy']), color = \"k\", linewidth=1.5, marker=\"o\")\n",
    "plt.legend(fontsize = 15, frameon=False)\n",
    "ax1.legend(['accuracy'], loc='center')\n",
    "plt.ylim([0, 100])\n",
    "plt.xlabel('Epoch #', fontsize=15)\n",
    "plt.ylabel('Accuracy [%]', fontsize=15)\n",
    "plt.tick_params(axis='both', which='major', labelsize=15)\n",
    "\n",
    "ax2 = ax1.twinx() \n",
    "color = 'tab:red'\n",
    "ax2.plot(history.epoch, history.history['loss'], color = color, linewidth=1.5, marker=\"s\")\n",
    "plt.legend(fontsize = 15, frameon=False)\n",
    "plt.legend(['loss'], loc='center right')\n",
    "plt.ylim([0, 5])\n",
    "plt.ylabel('CrossEntropy Loss', fontsize=15, color = color)\n",
    "ax2.tick_params(axis='y', which='major', labelsize=15, labelcolor=color)\n",
    "\n",
    "sbn.despine(offset=0.1, trim=True)"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.9.12"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
